//
//  PortOutProtocol.h
//  CocoaSynth
//
//  Created by Jérémy Brault on 06/02/10.
//  Copyright 2010 None. All rights reserved.
//

#import <Cocoa/Cocoa.h>

#import "SampleProtocol.h"

@protocol ComputingStrategyProtocol;
@protocol ConnectorProtocol;

@class Module;

/*!
    @protocol	PortOutProtocol
    @abstract	PortOutProtocol declare des operations permettant de gerer un port de sortie.
*/
@protocol PortOutProtocol <NSObject>

/*!
 @method     setConnector
 @abstract   Change le connecteur auquel le port est relié.
 @param      connector	Le nouveau connecteur.
 */
- (void)setConnector:(id<ConnectorProtocol>)aConnector;

/*!
    @method     isConnected
    @abstract   Indique si le port est connecte ou non.
    @result     YES si le port est connecté, NO sinon.
*/
- (BOOL)isConnected;


- /*!
    @method     setComputingStrategy
    @abstract   Change la strategie de calcul associee au port.
	@param		aComputingStrategy	La nouvelle strategie.

*/
- (void)setComputingStrategy:(id<ComputingStrategyProtocol>)aComputingStrategy;

/*!
    @method     executeStrategy
    @abstract   Execute la strategie de calcul associee au port.
*/
- (void)executeStrategy;

/*!
    @method     outputSample
    @abstract   Renvoie le sample present sur le port.
	@result     Le sample présent sur le port.
*/
- (id<SampleProtocol>)outputSample;

/*!
    @method		setOutputSample
    @abstract	Change le sample present sur le port.
    @param		data	Le nouveau sample.
*/
- (void)setOutputSample:(id<SampleProtocol>)aSample;

/*!
    @method     setDispatcher
    @abstract   <#(brief description)#>
    @discussion <#(comprehensive description)#>
    @param      dispatch <#(description)#>
*/
- (void)setDispatcher:(BOOL)dispatch;

/*!
    @method     isDispatcher
    @abstract   <#(brief description)#>
    @discussion <#(comprehensive description)#>
    @result     <#(description)#>
*/
- (BOOL)isDispatcher;

/*!
    @method     setModule
    @abstract   Change le module associe au port.
    @param      aModule Le nouveau module.
*/
- (void)setModule:(Module*)aModule;

/*!
    @method     module
    @abstract   Renvoie le module associe au port.
    @result     Le module associe au port.
*/
- (Module*)module;

@end
